package br.usp.ime.ingpos.web.controllers;

import java.util.List;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.usp.ime.ingpos.modelo.AreaDePesquisa;
import br.usp.ime.ingpos.modelo.Orientador;
import br.usp.ime.ingpos.modelo.ProcessoSeletivo;
import br.usp.ime.ingpos.modelo.TipoPerfil;
import br.usp.ime.ingpos.modelo.Usuario;
import br.usp.ime.ingpos.services.OrientadorService;
import br.usp.ime.ingpos.services.AreaDePesquisaService;
import br.usp.ime.ingpos.services.ProcessoSeletivoService;
import br.usp.ime.ingpos.web.interceptors.RestrictAccessPerfil;
import br.usp.ime.ingpos.web.interceptors.Transactional;

@Resource
public class ProfessorController {
	
    private final Result result;
    private final Validator validador;
    private final UsuarioSessao usuarioSessao;
    private final OrientadorService orientadorService;
    private final AreaDePesquisaService areaDePesquisaService;
    private final ProcessoSeletivoService processoSeletivoService;
	
    public ProfessorController(
	    final Result result,
	    final Validator validador,
	    final UsuarioSessao usuarioSessao,
	    final OrientadorService orientadorService,	    
	    final AreaDePesquisaService areaDePesquisaService,
	    final ProcessoSeletivoService processoSeletivoService)
    {
        this.result = result;
        this.validador = validador;
        this.usuarioSessao = usuarioSessao;
        this.orientadorService = orientadorService;
        this.areaDePesquisaService = areaDePesquisaService;
        this.processoSeletivoService = processoSeletivoService;
    }
    
    @Get
    @Path( "/professor/cadastraInformacoes" )
    @RestrictAccessPerfil( values = {
        TipoPerfil.CANDIDATO, TipoPerfil.SECRETARIA
    } )
    public void cadastraInformacoes()
    {
        List<AreaDePesquisa> areasDePesquisa = areaDePesquisaService.procurarTodasAreasDePesquisa();        
        Orientador orientador  = new Orientador();
        orientador = orientadorService.procurarPorId( usuarioSessao.getUsuarioId());

        result.include( "areasDePesquisa", areasDePesquisa );
        result.include( "professor", usuarioSessao.getUsuario());
        result.include( "quantidadeOrientandosDesejados" , orientador.getQuantidadeOrientandosDesejados());
        result.include( "areasDePesquisaEscolhida", orientadorService.procurarPorId(usuarioSessao.getUsuarioId()).getAreasDePesquisa() ); 
    }
    
    @Post
    @Path( "/professor/salvarInformacoes" )
    @Transactional
    @RestrictAccessPerfil( values = {
        TipoPerfil.CANDIDATO, TipoPerfil.SECRETARIA
    } )
    public void salvaInteresse( final List<Long> area, final int quantidadeOrientandosDesejados )
    {
    	orientadorService.salvarAreasDePesquisa( usuarioSessao.getUsuarioId(), area );
        orientadorService.salvarQuantidadeDeOrientandosDesejados(usuarioSessao.getUsuarioId() , quantidadeOrientandosDesejados);

        result.include( "messages", "interesse_marcado_com_sucesso" );
        result.forwardTo( this ).cadastraInformacoes();
    }
    
    @Get
    @Path( "/professor/lista" )
    public void listaProfessores() {
    	List<Orientador> orientadores = orientadorService.procurarTodosOrientadores();
        result.include( "orientadores", orientadores );
    }
    
    @Get
    @Path("/professor/enviarEmailsProcessoFechado")
    public void enviarEmailsProcessoFechado(){
        List<ProcessoSeletivo> processos = processoSeletivoService.buscaProcessosSeletivosAbertos();
        result.include( "processos", processos );   
    }
    
    @Post
    @Path("/professor/enviarEmailsProcessoFechado")
    public void enviarEmailsProcessoFechado(long processoSeletivoId){
        ProcessoSeletivo processoSeletivo = processoSeletivoService.getProcessoSeletivo( processoSeletivoId );
        List<Orientador> orientadores = orientadorService.procurarTodosOrientadores();
        processoSeletivoService.enviarEmailProfessores(orientadores, processoSeletivo);
    }
}
